//package pres.moling.common.http;
//
//
//import pres.moling.common.tool.MapHelper;
//import pres.moling.common.tool.StrHelper;
//
//
//import java.io.IOException;
//import java.io.InputStream;
//import java.net.URI;
//import java.net.http.HttpClient;
//import java.net.http.HttpRequest;
//import java.net.http.HttpResponse;
//import java.time.Duration;
//import java.util.Map;
//import java.util.StringJoiner;
//
///**
// * http 操作工具类
// *
// * @author moling
// */
//public interface HttpHelper {
//
//
//
//    /**
//     * 将map参数转换为url参数
//     *
//     * @param paramMap 参数
//     * @return 转换后的参数
//     */
//    static String toUrlParam(Map<String, Object> paramMap) {
//        StringBuffer result = new StringBuffer();
//        if (MapHelper.isEmpty(paramMap)) {
//            return null;
//        }
//        paramMap.forEach(
//                (k, v) -> {
//                    if (StrHelper.isNotBlank(k) && v != null) {
//                        result.append(k)
//                                .append("=")
//                                .append("v")
//                                .append("&");
//                    }
//                }
//        );
//        if (!result.isEmpty()) {
//            return result.substring(0, result.capacity() - 1);
//        }
//        return null;
//    }
//
//    /**
//     * 发送 GET请求
//     */
//    static String sendGet(String url, Map<String, Object> paramMap) throws IOException, InterruptedException {
//        url += "?" + toUrlParam(paramMap);
//        return HttpClient.newBuilder().build()
//                .send(HttpRequest.newBuilder().GET().uri(URI.create(url)).build(), HttpResponse.BodyHandlers.ofString())
//                .body();
//    }
//
//    static String sendPost(String url, Map<String, Object> paramMap) {
//        return HttpClient.newBuilder().build()
//                .send(HttpRequest.newBuilder().POST(HttpRequest.BodyPublishers.fromPublisher()))
//    }
//
//    /**
//     * 构造Get请求
//     *
//     * @param url 请求地址
//     * @return 返回的响应信息
//     */
//    private HttpRequest buildGetRequest(String url) {
//        return HttpRequest.newBuilder()
//                .GET()
//                .headers(httpConnectorConfig.buildHeader())
//                .uri(URI.create(url))
//                .timeout(Duration.ofMillis(httpConnectorConfig.getDefaultReadTimeout()))
//                .build();
//    }
//
//    /**
//     * 构造Post请求，form表单提交
//     *
//     * @param url  请求地址
//     * @param form 提交的form表单
//     * @return 返回的响应信息
//     */
//    private HttpRequest buildPostRequest(String url, Map<String, Object> form) {
//        return HttpRequest.newBuilder()
//                .POST(formToPublisher(form))
//                .headers(httpConnectorConfig.buildHeader("application/x-www-form-urlencoded"))
//                .uri(URI.create(url))
//                .timeout(Duration.ofMillis(httpConnectorConfig.getDefaultReadTimeout()))
//                .build();
//    }
//
//    /**
//     * 构造Put请求，form表单提交
//     *
//     * @param url  请求地址
//     * @param form 提交的form表单
//     * @return 返回的响应信息
//     */
//    private HttpRequest buildPutRequest(String url, Map<String, Object> form) {
//        return HttpRequest.newBuilder()
//                .PUT(formToPublisher(form))
//                .headers(httpConnectorConfig.buildHeader("application/x-www-form-urlencoded"))
//                .uri(URI.create(url))
//                .timeout(Duration.ofMillis(httpConnectorConfig.getDefaultReadTimeout()))
//                .build();
//    }
//
//    /**
//     * 构造Delete请求
//     *
//     * @param url 请求地址
//     * @return 返回的响应信息
//     */
//    private HttpRequest buildDeleteRequest(String url) {
//        return HttpRequest.newBuilder()
//                .DELETE()
//                .headers(httpConnectorConfig.buildHeader())
//                .uri(URI.create(url))
//                .timeout(Duration.ofMillis(httpConnectorConfig.getDefaultReadTimeout()))
//                .build();
//    }
//
//
//    /**
//     * 发送Get请求
//     *
//     * @param url      请求地址
//     * @param resClass 响应类型，支持：byte[].class、String.class、InputStream.class
//     * @param <T>      响应类型
//     * @return 响应信息
//     * @throws IOException          IO异常
//     * @throws InterruptedException 线程等待
//     */
//    public <T> T doGet(String url, Class<T> resClass) throws IOException, InterruptedException {
//        HttpRequest httpRequest = buildGetRequest(url);
//        return response(httpRequest, resClass);
//    }
//
//    /**
//     * 发送Post请求
//     *
//     * @param url      请求地址
//     * @param form     提交的表单
//     * @param resClass 响应类型，支持：byte[].class、String.class、InputStream.class
//     * @param <T>      响应类型
//     * @return 响应信息
//     * @throws IOException          IO异常
//     * @throws InterruptedException 线程等待
//     */
//    public <T> T doPost(String url, Map<String, Object> form, Class<T> resClass) throws IOException, InterruptedException {
//        HttpRequest httpRequest = buildPostRequest(url, form);
//        return response(httpRequest, resClass);
//    }
//
//    /**
//     * 发送Put请求
//     *
//     * @param url      请求地址
//     * @param form     提交的表单
//     * @param resClass 响应类型，支持：byte[].class、String.class、InputStream.class
//     * @param <T>      响应类型
//     * @return 响应信息
//     * @throws IOException          IO异常
//     * @throws InterruptedException 线程等待
//     */
//    public <T> T doPut(String url, Map<String, Object> form, Class<T> resClass) throws IOException, InterruptedException {
//        HttpRequest httpRequest = buildPutRequest(url, form);
//        return response(httpRequest, resClass);
//    }
//
//    /**
//     * 发送Delete请求
//     *
//     * @param url      请求地址
//     * @param resClass 响应类型，支持：byte[].class、String.class、InputStream.class
//     * @param <T>      响应类型
//     * @return 响应信息
//     * @throws IOException          IO异常
//     * @throws InterruptedException 线程等待
//     */
//    public <T> T doDelete(String url, Class<T> resClass) throws IOException, InterruptedException {
//        HttpRequest httpRequest = buildDeleteRequest(url);
//        return response(httpRequest, resClass);
//    }
//
//    /**
//     * 通用发送请求并解析响应
//     *
//     * @param httpRequest 请求体
//     * @param resClass    响应类型
//     * @param <T>         响应类型
//     */
//    private <T> T response(HttpRequest httpRequest, Class<T> resClass) throws IOException, InterruptedException {
//        T t;
//        if (byte[].class == resClass) {
//            t = (T) client.send(httpRequest, HttpResponse.BodyHandlers.ofByteArray()).body();
//        } else if (String.class == resClass) {
//            t = (T) client.send(httpRequest, HttpResponse.BodyHandlers.ofString(httpConnectorConfig.getResponseCode())).body();
//        } else if (InputStream.class == resClass) {
//            t = (T) client.send(httpRequest, HttpResponse.BodyHandlers.ofInputStream()).body();
//        } else {
//            throw new UnsupportedOperationException(MessageFormat.format("暂不支持该类型返回：[{0}]", resClass));
//        }
//        return t;
//    }
//
//    /**
//     * 将Form表单转换为请求所需的publisher，供post、put等模式调用
//     *
//     * @param form Form表单内容
//     * @return 转换后的publisher
//     */
//    private HttpRequest.BodyPublisher formToPublisher(Map<String, Object> form) {
//        StringJoiner sj = new StringJoiner("&");
//        form.forEach((k, v) -> sj.add(k + "=" + v.toString()));
//        return HttpRequest.BodyPublishers.ofString(sj.toString(), httpConnectorConfig.getRequestCode());
//    }
//
//
//}
